/**
 * @author VernHe
 * @date 2021年06月09日 23:50
 */
public class Solution_0152 {
    public int maxProduct(int[] nums) {
        // imax表示前i个数乘积的最大值,imin表示最小值
        int res = Integer.MIN_VALUE, imax = 1, imin = 1;
        for (int i = 0; i < nums.length; i++) {
            // 当遇到负数的时候,imin * 负数 >= imax * 负数，因此，
            // 此时的最大值要在imin * num[i] 和 num[i]之间选一个
            // 最小值要在imax * num[i] 和 num[i]之间选一个
            // 其实就是需要进行交换
            if (nums[i] < 0) {
                int temp = imin;
                imin = imax;
                imax = temp;
            }
            // 当前数乘上前i个数的最大值，或者不乘，在这两个结果间取最大值
            imax = Math.max(nums[i] * imax, nums[i]);
            // 同上
            imin = Math.min(nums[i] * imin, nums[i]);

            res = Math.max(imax,res);
        }
        return res;
    }
}
